package cn.tedu._05weibo.common.exception;

import cn.tedu._05weibo.common.response.JsonResult;
import cn.tedu._05weibo.common.response.StatusCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import javax.validation.ConstraintViolationException;

import static jdk.nashorn.internal.runtime.regexp.joni.Config.log;

/**
 * @ControllerAdvice注解：
 * 1.该注解标识此类为全局异常处理器的类
 * 2.当控制器中抛出异常时，框架会先检查有没有定义全局异常处理器
 * 3.如果有全局异常处理器，则将异常交给全局异常处理器处理
 * 4.如果没有全局异常处理器，则将异常交给SpringMVC默认的异常处理器处理[不友好]
 */

/**
 * @RestControllerAdvice注解：相当于@ControllerAdvice+@ResponseBody
 */
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
//    @ExceptionHandler
//    public JsonResult doHandleIllegalArgumentException(IllegalArgumentException ex) {
//        String message = ex.getMessage();
//        log.error("IllegalArgumentException:" + message);
//       return new JsonResult(StatusCode.OPERATION_FAILED,message);
//    }
//    @ExceptionHandler
//    public JsonResult doHandleRuntimeException(RuntimeException ex) {
//        String message = ex.getMessage();
//        log.error("RuntimeException:" + message);
//        return new JsonResult(StatusCode.OPERATION_FAILED,message);
//    }
    @ExceptionHandler
    public JsonResult doHandleMethodArgumentNotValidException(MethodArgumentNotValidException ex) {
        //DTO类用此方法获取错误信息
        String message = ex.getFieldError().getDefaultMessage();
        log.error("MethodArgumentNotValidException:" + message);
        return new JsonResult(StatusCode.VALIDATE_ERROR,message);
    }

    @ExceptionHandler
    public JsonResult doHandleConstraintViolationException(ConstraintViolationException ex) {
        String message = ex.getMessage().split(":")[1].trim();
        log.error("ConstraintViolationException:" + message);
        return new JsonResult(StatusCode.VALIDATE_ERROR,message);
    }

    /**
     * Throwable异常处理方法，处理所有异常
     * 1.控制器抛出异常后，没有任何异常处理方法处理时，由该方法处理
     * 2.一旦添加了此方法，工程中再也不会有500状态码了
     * 3.一般最后添加此方法
     */
//    @ExceptionHandler
//    public JsonResult doHandleThrowable(Throwable ex) {
//        String message = ex.getMessage();
//        log.error("Throwable:" + message);
//        return new JsonResult(StatusCode.THROWABLE_ERROR,message);
//    }
}
